Programmierung von CAx-Systemen

David Straub

CAx-Programmierung – D. Straub

Gliederung

  1. Einführung
  2. Topologie
  3. Geometrie
  4. Modellierungsstrategien
  5. Datenaustausch
  6. Simulation
  7. Optimierung
  8. Fertigung
CAx-Programmierung – D. Straub

Geometrie II: Freiformkurven und Flächen

  • Motivation: Beispiel Wendelstein 7-X
  • Freiformkurven (1D): Bézier, B-Spline, NURBS (inkl. Stetigkeitsbedingungen)
  • Flächen (2D): analytisch, Sweep-Flächen, NURBS-Flächen
CAx-Programmierung – D. Straub

Beispiel: Plasmagefäß für Wendelstein 7-X

CAx-Programmierung – D. Straub

Mathematische Beschreibung der Plasmagrenzfläche

import numpy as np

R_mn = np.array([[0, 0, 5.559], [1, 0, 0.491],
    [0, 5, 0.264], [1, 5, -0.251], [2, 10, 0.064]])
Z_mn = np.array([[1, 0, 0.620], [0, 5, -0.238],
    [1, 5, 0.179], [2, 10, -0.056]])

def R(theta, phi):
    return sum(c * np.cos(m*theta - n*phi) for m, n, c in R_mn)

def Z(theta, phi):
    return sum(c * np.sin(m*theta - n*phi) for m, n, c in Z_mn)
CAx-Programmierung – D. Straub

Darstellung der Grenzfläche

Erzeugung der kartesischen Koordinaten

n_t = n_p = 100
# n_t x n_p Arrays
theta, phi = np.meshgrid(np.linspace(0, 2*np.pi, n_t), np.linspace(0, 2*np.pi, n_p))
r = R(theta, phi)
z = Z(theta, phi)
x, y = r * np.cos(phi), r * np.sin(phi)

Plot mit Plotly

import plotly.graph_objects as go

fig = go.Figure(go.Surface(x=x, y=y, z=z, colorscale="Viridis", showscale=False))
fig.update_layout(scene=dict(aspectmode="data"))
CAx-Programmierung – D. Straub

Grobes Gitter,

CAx-Programmierung – D. Straub

Feines Gitter,

CAx-Programmierung – D. Straub

W7-X: CAD-Geometrie des Plasmagefäßes

Vorgehen:

  1. Plasma-Querschnitt : -Punkte → geschlossener Kurve (Spline)
  2. Loft einer halben Feldperiode Solid
  3. Versatz der Mantelfläche um nach außen → Gefäßwand
CAx-Programmierung – D. Straub

Schritt 1: Querschnitt als Spline

import build123d as bd
from ocp_vscode import show

def make_section(phi_val, n=25):
    theta = np.linspace(0, 2*np.pi, n, endpoint=False)
    r = R(theta, phi_val);  z = Z(theta, phi_val)
    x, y = r * np.cos(phi_val), r * np.sin(phi_val)
    points = [bd.Vertex(1e3 * xi, 1e3 * yi, 1e3 * zi) for xi, yi, zi in zip(x, y, z)]
    spline = bd.Spline(*points, periodic=True)
    return points, spline

phi_values  = np.linspace(0, 2*np.pi/10, 10)
show([make_section(phi) for phi in phi_values])
  • periodic=True → geschlossene Kurve ohne Knick am Anfangspunkt
  • Rückgabe: Edge (ein einzelner Spline-Bogen)
CAx-Programmierung – D. Straub

Schritt 2: Loft einer halben Feldperiode

W7-X hat 5-fache toroidale Symmetrie mit Spiegelsymmetrie pro Periode

→ Halbe Periode

phi_values  = np.linspace(0, 2*np.pi/10, 20)
sections    = [bd.Wire([make_section(phi)[1]]) for phi in phi_values]
plasma = bd.Solid.make_loft(sections)
show(plasma)
  • sections: Liste von Wire-Objekten (hier: je ein Spline)
  • make_loft → erzeugt eine durch die sections verlaufende Fläche (Loft)
  • [e.geom_type for e in plasma.faces()][BSPLINE, PLANE, PLANE]
CAx-Programmierung – D. Straub

Schritt 3: Gefäßwand mit offset_3d

# Planare Deckelflächen als "Öffnungen" → offset_3d erzeugt eine Schale
caps = plasma.faces().filter_by(bd.GeomType.PLANE)
wall = plasma.offset_3d(caps, 200)

# Nur die äußere Versatzfläche behalten
vessel_face = wall.faces().filter_by(bd.GeomType.OFFSET)
show(plasma, vessel_face, names=["Plasmaoberfläche", "Gefäßwand"])
  • offset_3d(openings, amount) → hält die openings-Flächen offen, versetzt alle anderen um amount
  • [e.geom_type for e in wall.faces()][BSPLINE, PLANE, OFFSET, PLANE]
  • .filter_by(GeomType.OFFSET) → selektiert die neu entstandene Außenfläche
CAx-Programmierung – D. Straub

Freiformkurven

CAx-Programmierung – D. Straub

Motivation: Grenzen analytischer Kurven

Wie beschreibt man eine freie Kurve mathematisch?

Analytische Kurven aus Teil 1 (Linie, Kreis, Ellipse, Kegelschnitte) haben eine feste Form – ihre Gleichung bestimmt den Kurvenverlauf vollständig, freie Formgebung ist nicht möglich.

Das W7-X-Beispiel vom Beginn dieser Vorlesung illustriert das: Der Querschnitt des Plasmabehälters lässt sich durch keinen analytischen Kurventyp ausdrücken.

→ Wir brauchen Freiformkurven: flexibel formbar, lokal steuerbar, für beliebige Geometrie geeignet.

CAx-Programmierung – D. Straub

Wiederholung: Parametrische Kurven

Eine parametrische Kurve bildet einen Parameter auf einen Punkt im Raum ab:

Analytische Kurve Parametrisierung
Linie
Kreis (Radius )
Ellipse

Vorteile der Parameterdarstellung:

  • Punkte, Tangenten, Krümmung durch einfache Ableitungen ,
  • Einfach zu verkürzen und einen Punkt auf der Kurve zu finden
CAx-Programmierung – D. Straub

Warum Polynome?

Eine Kurve ist eine Funktion – aber welche Funktion wählt man?

Ansatz Problem
Lineare Interpolation Knicke an jedem Stützpunkt
Sinus, Kosinus schwer zu verketten, teuer auszuwerten
Interpolationspolynome Runge-Phänomen: Oszillationen bei vielen Punkten
Polynome niedrigen Grades ✓ einfach, schnell, stabil – aber begrenzte Form
Stückweise Polynome ✓ flexibel, stabil, lokal kontrollierbar

→ Alle Freiformkurven in CAD (Bézier, B-Spline, NURBS) basieren auf stückweisen Polynomen niedrigen Grades.

CAx-Programmierung – D. Straub

Kurven in Potenzbasis

Der naheliegende Ansatz: Koordinaten als Polynome in ,

Probleme der Potenzbasis:

  • Kein geometrischer Bezug: Die Koeffizienten haben keine anschauliche Bedeutung – man kann den Kurvenverlauf nicht aus ihnen ablesen
  • Numerische Empfindlichkeit: Bei hohen Graden reagiert die Kurvenform sehr sensibel auf kleine Änderungen einzelner Koeffizienten
  • Schlechte Interaktivität: Um eine Kurve zu ändern, muss man ein Gleichungssystem lösen

→ Gesucht: eine Basis, deren Parameter direkt geometrische Bedeutung haben.

CAx-Programmierung – D. Straub

Pierre Bézier

Anfang der 1960er Jahre bei Renault:

  • Ziel: Karosserie-Design am Computer
  • 1962 publiziert
  • CAD-System: UNISURF (1968)

Idee: Kontrollpunkte, die die Kurve anziehen – geometrisch intuitiv, numerisch stabil.

CAx-Programmierung – D. Straub

Bézier-Kurven: Formel

  • : Kontrollpunkte (bilden das Kontrollpolygon)
  • : Bernstein-Basisfunktionen – nicht-negativ,
  • Grad = Anzahl Kontrollpunkte

Geometrische Interpretation:
ist stets eine Konvexkombination der Kontrollpunkte → die Kurve liegt immer innerhalb der konvexen Hülle des Kontrollpolygons.

CAx-Programmierung – D. Straub

Bézier-Kurven: Grade 1, 2 und 3

Grad Kontrollpunkte Form
gerade Strecke
Parabel
kubische Kurve

Eigenschaften:

  • Kurve läuft durch und
  • Tangente in : Richtung
  • Kurve liegt in der konvexen Hülle der Kontrollpunkte

🔗 Interaktives Applet (GeoGebra)

CAx-Programmierung – D. Straub

Bézier: Warum reicht das nicht für CAD?

Bézier ist ein konzeptioneller Zwischenschritt – elegant und lehrreich, für reale CAD-Geometrie aber nicht ausreichend.

  • Polynomgrad wächst mit Anzahl der Kontrollpunkte: 20 Punkte → Grad 19 → numerisch instabil
  • Jeder Kontrollpunkt beeinflusst die gesamte Kurve – keine lokale Kontrolle

Erster Schritt zur Lösung: Kurve in mehrere Segmente aufteilen – jedes ein Bézier-Stück niedrigen Grades.

→ Aber wie glatt müssen diese Verbindungen sein?

CAx-Programmierung – D. Straub

Stetigkeitsbedingungen

Beim Verbinden mehrerer Kurvenabschnitte bestimmt die Anschlussbedingung die wahrgenommene Qualität:

: -te Ableitung von stetig (abh. von Parametrisierung)
: geometrisch stetig, unabh. von Parametrisierung

Grad Bedingung Effekt
kein Spalt, keine Überlappung Knick sichtbar
gleiche Tangente (Richtung + Betrag) glatter Übergang
gleiche Tangentenrichtung (Betrag egal) glatt, flexibler als
/ gleiche Krümmung reflexionsglatt
CAx-Programmierung – D. Straub

Stetigkeitsbedingungen: Warum C² wichtig ist

(glatte Tangente) klingt ausreichend – reicht aber oft nicht:

Anwendung Warum / nötig?
Optik / Design Lichtreflexion folgt der Krümmung – ein Sprung ist sichtbar
Fertigung Fräserbahn folgt der Krümmung – Krümmungssprung → Maßabweichung
Fluiddynamik Druckgradient und Grenzschicht reagieren auf Krümmungsänderungen

Typische Anforderungen in der Praxis:

  • : Boolesche Operationen (scharfe Kante erwünscht)
  • : fillet / Verrundung, Standard-Übergänge
  • : Karosseriedesign, aerodynamische Flächen, Medizinprodukte
CAx-Programmierung – D. Straub

Stückweise Bézier – warum nicht?

Mehrere Bézier-Segmente mit verbinden: geht, kostet aber viele Bedingungen.

Bei zwei kubischen Bézier-Stücken und am Verbindungspunkt:

Bedingung Gleichung Eingeschränkte Freiheitsgrade
1 Punkt fixiert
weiterer Punkt fixiert
Krümmungsgleichheit noch ein Punkt fixiert

🔗 Interaktives Applet (GeoGebra)

→ Bei sind an jedem Verbindungspunkt 3 von 4 Kontrollpunkten abhängig – bei vielen Segmenten ineffizient.

Gesucht: -Stetigkeit automatisch, ohne Gleichungssystem.

CAx-Programmierung – D. Straub

B-Spline-Kurven: Grundidee

Eine einzige Formel für die gesamte Kurve – kein separates Stück pro Segment:

Der Knotenvektor teilt in Polynomstücke auf:

u:   t₀────t₁────t₂────t₃────t₄────t₅
         Seg.1  Seg.2  Seg.3  Seg.4
  • Kontrollpunkte, Ordnung (= Grad + 1), z. B. für kubisch
  • Die Basisfunktionen sorgen automatisch für Stetigkeit an den Knoten
CAx-Programmierung – D. Straub

B-Spline-Basisfunktionen: Grad 0 und 1

Grad 0 – Startpunkt der Rekursion, Rechteckfunktion:

Grad 1 – explizit durch Einsetzen in die Rekursion:

Linear ansteigend, dann linear abfallend – eine Hutfunktion über zwei Spannen, an den Knoten.

CAx-Programmierung – D. Straub

B-Spline-Basisfunktionen: höhere Grade (Cox–de Boor)

Höhere Grade entstehen durch Rekursion über den Grad:

Jede Stufe: eine Spannen breiterer Träger, eine Stufe mehr Stetigkeit:

Grad Ordnung Träger von Stetigkeit an Knoten
0 (konstant) 1 1 Spanne unstetig (Rechteck)
1 (linear) 2 2 Spannen – Knick
2 (quadratisch) 3 3 Spannen – glatt
3 (kubisch) 4 4 Spannen – krümmungsstetig ✓

→ Kubische B-Splines () sind der CAD-Standard: ist eingebaut, kein Gleichungssystem nötig.

CAx-Programmierung – D. Straub

B-Spline: lokaler Träger = lokale Kontrolle

Da nur auf Spannen ungleich null ist, beeinflusst nur diesen Bereich der Kurve:

Stückw. Bézier B-Spline
Stetigkeit explizit erzwungen eingebaut in
Modifikation global pro Segment lokal – nur Spannen
Grad fest (z. B. 3) frei wählbar, unabh. von
CAx-Programmierung – D. Straub

B-Spline: interaktive Visualisierung

Eine einzelne kubische Basisfunktion (Grad 3, Ordnung ) als Funktion von :

  • Träger: 5 Knoten 4 Spannen ( Spannen, da Ordnung )
  • Knotenabstände sind verschiebbar → Form der Basisfunktion ändert sich
  • Bei gleichmäßigen Knoten (): symmetrische Glockenform

Analogie: ist das B-Spline-Äquivalent zur Bernstein-Basisfunktion bei Bézier – aber mit lokalem Träger statt globalem.

🔗 Interaktives Applet (GeoGebra)

CAx-Programmierung – D. Straub

Knotenvielfachheit

Ein Knoten darf im Knotenvektor mehrfach vorkommen. Die Vielfachheit steuert die Stetigkeit an diesem Knoten:

Vielfachheit Stetigkeit Effekt
Standard – glatt (z. B. für kubisch)
nur noch tangensstetig
Knick – wie Bézier-Verbindungspunkt
Kurve läuft durch Kontrollpunkt

Anwendungen:

  • Anfangs-/Endknoten: Vielfachheit → Kurve startet/endet exakt im ersten/letzten Kontrollpunkt (clamped B-Spline)
  • Scharfe Kante: lokale Vielfachheit → gezielter Knick in der Kurve
  • Bézier-Extraktion: Vielfachheit an allen inneren Knoten → stückweise Bézier-Darstellung
CAx-Programmierung – D. Straub

NURBS: Warum?

Kann ein B-Spline einen perfekten Kreis darstellen?

Antwort: Nein – B-Splines sind stückweise Polynome, Kreise sind trigonometrisch. Ein B-Spline kann einen Kreis nur annähern, nie exakt darstellen.

Das zeigt: B-Splines sind nicht allgemein genug für alle Kurvenformen.

Hinweis: OCCT speichert Kreise intern trotzdem als CIRCLE (analytisch, exakt) – nicht als B-Spline. Aber: CAD-Systeme, die intern nur eine Kurvenart verwenden, brauchen eine Darstellung, die auch Kreise exakt abdeckt.

→ Lösung: Gewichte hinzufügen → NURBS kann Kreise, Kegelschnitte und Freiformkurven in einem Format darstellen.

CAx-Programmierung – D. Straub

Warum kein Polynom für den Kreis?

Ein B-Spline ist stückweise polynomial:

Sind , Polynome vom Grad , so ist ein Polynom vom Grad .

Dieses kann nur dann für alle konstant gleich sein, wenn alle nicht-konstanten Terme verschwinden – d. h. und wären konstant. Widerspruch.

Ein B-Spline kann einen Kreis nur annähern, niemals exakt darstellen.

CAx-Programmierung – D. Straub

NURBS: rationale Parametrisierung des Kreises

Rationale Funktionen (Quotient zweier Polynome) umgehen dieses Problem:

Viertelkreis als quadratische NURBS (exakt):

Kontrollpunkt
Gewicht

Das reduzierte Gewicht „zieht" die Kurve vom Kontrollpunkt weg – genau so, dass der Kreisbogen entsteht.

CAx-Programmierung – D. Straub

NURBS – Non-Uniform Rational B-Splines

Erweiterung des B-Spline um Gewichte :

  • für alle → normaler B-Spline (Spezialfall)
  • Größeres → Kurve nähert sich stärker dem Kontrollpunkt

Entscheidender Vorteil:

B-Spline kann Kreise und Kegelschnitte nur annähern.
NURBS stellt sie exakt dar.

CAx-Programmierung – D. Straub

NURBS: die universelle Darstellung

Linie / Kreis ⊂ Bézier ⊂ B-Spline ⊂ NURBS

Alle analytischen Kurven sind Spezialfälle von NURBS – daher ist NURBS der einheitliche Standard in industriellen CAD-Systemen (CATIA, SolidWorks, NX, OCCT).

geom_type in OCCT Bedeutung
LINE, CIRCLE, ELLIPSE analytisch gespeichert (exakt)
BSPLINE NURBS-Kurve (Freiformkurve oder konvertierte Analytik)

Beim Import aus STEP: Freiformkurven erscheinen als BSPLINE, auch wenn sie ursprünglich Kreise waren – je nach exportierendem System.

CAx-Programmierung – D. Straub

Übung: Spline vs. Polyline

Datei: praktikum_stetigkeit.py – Aufgabe 1

Erzeuge dieselben 5 Punkte einmal mit Spline und einmal mit Polyline. Gib geom_type aller Kanten aus:

punkte = [(0,0,0),(10,15,0),(25,5,0),(40,20,0),(50,0,0)]
with bd.BuildLine() as bl_spline:
    bd.Spline(*punkte)
with bd.BuildLine() as bl_poly:
    bd.Polyline(*punkte)
print([e.geom_type for e in bl_spline.edges()])
print([e.geom_type for e in bl_poly.edges()])

Füge danach tangents=[(1,0,0),(0,-1,0)] hinzu – ändert sich der geom_type?

CAx-Programmierung – D. Straub

Übung: fillet als Flächenerzeuger

Datei: praktikum_stetigkeit.py – Aufgabe 2

box = bd.Box(50, 30, 20)
box_f = bd.fillet(box.edges(), 3)
print(set(f.geom_type for f in box.faces()))
print(set(f.geom_type for f in box_f.faces()))

Welche geom_type-Werte erscheinen neu? Warum auch SPHERE?

CAx-Programmierung – D. Straub

Flächen

CAx-Programmierung – D. Straub

Parametrische Flächen: Wiederholung

Jede Fläche ist eine Funktion von zwei Parametern und :

Jede Face in einem B-Rep-Modell trägt eine solche parametrische Fläche.

CAx-Programmierung – D. Straub

Analytische Flächen

Exakt durch eine geschlossene Formel beschreibbar:

Typ Charakteristik geom_type build123d
Ebene konstante Normale PLANE Box, Rectangle
Zylinder CYLINDER Cylinder
Kegel wie Zylinder, CONE Cone
Kugel SPHERE Sphere
Torus Kreisring um Achse TORUS Torus

Für Standardkörper reichen analytische Flächen vollständig aus.

CAx-Programmierung – D. Straub

Sweep-Flächen

Entstehen durch Bewegung eines Profils entlang einer Leitkurve:

Typ Beispiel geom_type (Kreis-Profil) geom_type (Freiform)
Extrusion Wandfläche CYLINDER BSPLINE
Rotation Kegelfläche SPHERE / TORUS BSPLINE
Sweep Rohr, Schiene CYLINDER BSPLINE
Loft Tragflügel, Rumpf BSPLINE BSPLINE

Das Eingangsprofil bestimmt die Komplexität der Ausgabefläche.

CAx-Programmierung – D. Straub

NURBS-Flächen

Verallgemeinerung der NURBS-Kurve auf zwei Parameter:

  • Kontrollpunktnetz : 2D-Gitter statt 1D-Liste
  • Spezialfall : Nenner = 1 (da ) → B-Spline-Fläche
  • In OCCT: geom_type == 'BSPLINE' gilt für beide Fälle – B-Spline und NURBS sind dieselbe Klasse

Anwendungen: Karosserie, Strömungsflächen, Tragflügel, Medizinprodukte, ...

CAx-Programmierung – D. Straub

Stetigkeitsbedingungen bei Flächen

Dieselben Bedingungen wie bei Kurven, jetzt für aneinanderstoßende Flächen:

Grad Bedingung Sichtbar als
kein Spalt scharfe Kante
Normalenvektoren stetig (gleiche Tangentenebene) Kante verschwindet im Licht
Krümmung stetig Reflexion läuft nahtlos durch

In build123d:

  • fillet(edges, radius) an der Kante
  • Verbindungsflächen zwischen Loft-Profilen → je nach Einstellung bis

W7-X: Die BSPLINE-Mantelfläche und die OFFSET-Gefäßwand stoßen an den Deckeln auf PLANE-Flächen – dort ist nur garantiert (scharfe Kante).

CAx-Programmierung – D. Straub

Übung: Loft → NURBS-Fläche

Datei: praktikum_stetigkeit.py – Aufgabe 3

Lofte von einem Kreis (unten) auf ein Rechteck (oben):

kreis = bd.Wire([bd.Edge.make_circle(10)])
# ... Rechteck in 40 mm Höhe ...
loft = bd.Solid.make_loft([kreis, rechteck])
print(set(f.geom_type for f in loft.faces()))

Warum erscheint kein CIRCLE in den Flächen?

CAx-Programmierung – D. Straub

Zusammenfassung

CAx-Programmierung – D. Straub

Kernkonzepte dieser Vorlesung

Freiformkurven:

Bézier (global) → B-Spline (lokal) → NURBS (+ Gewichte, universell)

  • NURBS ist der Standard: kann Linien, Kreise und Freiformkurven in einem Format darstellen
  • Lokale Modifikation: Kontrollpunkt beeinflusst nur benachbarte Segmente

Stetigkeitsbedingungen: (kein Spalt) → (glatt) → (reflexionsglatt)

Flächen:

  • Analytisch: Ebene, Zylinder, Kegel, Kugel, Torus
  • Sweep-Flächen: Extrusion, Rotation, Sweep, Loft
  • NURBS-Flächen: universelle Freiformflächen
CAx-Programmierung – D. Straub

Ausblick: Modellierungsstrategien

In der nächsten Einheit: Wie baut man komplexe Modelle systematisch auf?

  • Parametrische Konstruktionsstrategie (Feature-Baum)
  • Boolesche Operationen und ihre Reihenfolge
  • Robuste Selektoren und parametrische Abhängigkeiten
  • Wiederverwendbare Komponenten und Baugruppen
CAx-Programmierung – D. Straub